import javax.swing.ImageIcon;

import br.furb.furbot.Direcao;
import br.furb.furbot.ObjetoDoMundo;
import br.furb.furbot.exceptions.MundoException;
import br.furb.furbot.suporte.LoadImage;

public class Tiro extends ObjetoDoMundoAdapterVeloz {

    private Direcao dirH;
    private Direcao dirV;
    private String imagem;
    private Combatente lancador;
    private boolean executar;

    public Tiro(Direcao direcaoHorizontal, Direcao direcaoVertical, String imagem, Combatente lancador) {
        this.desbloquear();
        this.dirH = direcaoHorizontal;
        this.dirV = direcaoVertical;
        this.imagem = imagem;
        this.lancador = lancador;
        this.executar = true;
    }

    public ImageIcon buildImage() {
        return LoadImage.getInstance().getIcon(getImagem());
    }

    public void executar() throws Exception {
        while (this.executar) {
            if (!ehFim(dirH) && !ehFim(dirV) && (dirH == ABAIXO && getY() != Mundo.TOTAL_LINHAS || dirH == ACIMA)) {
                avancar();
                ObjetoDoMundo obj = getObjeto(AQUIMESMO);
                if (obj != null) {
                    verificaAlvo(obj);
                    this.executar = false;
                }
            } else {
                removerMe();
                this.executar = false;
            }
        }
    }

    private void verificaAlvo(ObjetoDoMundo objeto) {
        String tipo = objeto.getSouDoTipo();
        if (tipo.equals(Mundo.class.getName())) {
            explodir();
        } else {
            if (tipo.equals(Submarino.class.getName())) {
                Submarino submarino = (Submarino) objeto;
                submarino.perderVida();
                explodir();
            } else {
                if (tipo.equals(Aviao.class.getName())) {
                    Aviao aviao = (Aviao) objeto;
                    aviao.perderVida();
                    explodir();
                }
            }
        }
    }

    private void explodir() {
        removerMe();
        adicionarObjetoNoMundo(new Explosao(), AQUIMESMO);
    }

    private void avancar() {
        int y = getY();
        int x = getX();
        switch (dirH) {
            case ABAIXO:
                y++;
                break;
            case ACIMA:
                y--;
                break;
        }
        switch (dirV) {
            case ESQUERDA:
                x--;
                break;
            case DIREITA:
                x++;
                break;
        }
        mudarPosicao(x, y);
    }

    @Override
    public void removerMe() throws MundoException {
        lancador.setTiro(null);
        super.removerMe();
    }

    public void pararExecucao() {
        this.executar = false;
        removerMe();
    }

    /**
     * Getters and Setters
     */

    public String getImagem() {
        return imagem;
    }
}
